"""
	Python函数的各种参数介绍
"""
# 像这里的1 2 "abc" 叫做参数 在方法调用时所提供的参数叫做实际参数.简称实参
print(1)
print(2)
print("abc")


# 这是方法声明.在方法声明时所提供的参数.是形式参数简称形参
def add(num1,num2):
    return num1 + num2


# 参数的作用是什么?方法是对业务逻辑的封装.而业务逻辑是没有数据的.
# 在业务具体执行时是需要数据的支持.有些数据可以内部自己生成(内部变量)
# 有些数据是内部无法合成的,必须通过外部传入.传入的入口就是参数.参数就是进料口!
# 在我们调用函数时必须要安装规定的参数提供数据.
add(1,2)

# 在Python中有5种参数
# 1.必须参数 2.关键字参数 3.默认参数 4.可变参数 5.组合参数


# 必须参数:必须以正确的顺序和数量传入到函数中.  上面add(num1,num2)就是必须参数
# 关键字参数:这里的关键字不是break,continue等关键字.而是函数声明时所给与的参数名称.
#   使用关键字参数允许在调用函数时传入的顺序和声明不一致.

def info(name,age):
    print("姓名:{} 年龄:{}".format(name,age))
    

# 这就是关键字参数.一般情况下 关键字参数要位于必须参数(位置参数)之后
info(age="19",name="张三")


def abc(i,j,k):
    print("{} {} {}".format(i,j,k))

# SyntaxError: positional argument follows keyword argument
# 关键字参数要位于必须参数之后
# abc(k = 10 ,j = 20,1)
abc(1,k = 10 ,j = 20)


# 默认参数 就是默认值参数
# create table test(id int ,name varchar(11),gender char(2) default '男');

print("----------------------------")

# SyntaxError: non-default argument follows default argument
# 默认值参数一定要写在非默认值参数的后面
# 扩展问题:如果有多个默认值参数怎么办?
def info(name,age=85):
    print("姓名:{} 年龄:{}".format(name,age))

info("朱宇豪")

# 如果需要一个函数能够处理更多的声明参数我们可以使用可变参数.可变参数在声明时是不会被命名的
# 可变参数在函数调用时,可以给值,也可以不给值.给的值可以有1个也可以有多个.使用元组来保存
def info(*args): 
    print(type(args))  # 元组
    for i in args:
        print(i)

info(1,2,3,4,5,6,7,8,9,10)

# python参数的顺序是: 必须 默认 可变 关键字

print("-------------------------------------------")
def info(p1,p2,df=0,*args,**kwargs):
    print(f'p1={p1},p2={p2},df={df},args={args},kwargs={kwargs}')
    

info(1,2)
info(1,2,a=3)
info(1,2,3,'a','b')
info(1,2,"abc",b=10)



